package com.example.util;


import io.jsonwebtoken.*;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Jwt工具类
 */

@Data                                                       //用于添加get和set方法
@Component                                                  //注入到spring容器中
@ConfigurationProperties(prefix = "example.jwt")            //Spring Boot会从application.yml中获取其属性对应的属性值给其进行注入
public class JwtUtils {

    private long expire;                                    //用于修改jwt过期时间
    private String secret;                                  //设置密钥
    private String header;                                  //jwt名称

    //定义Jwt生成规则并生成Jwt
    public String generateToken(String username) {

        Date nowDate = new Date();                              //生成目前的时间对象
        Date expireDate = new Date(nowDate.getTime() + 1000 * expire); // 设置过期时间为7天过期

        return Jwts.builder()                               //使用Jwts的builder工具类
                .setHeaderParam("typ","JWT")    //设置请求头参数
                .setSubject(username)                       //设置主体为username
                .setIssuedAt(nowDate)                       //设置创建时间
                .setExpiration(expireDate)                  //设置过期时间
                .signWith(SignatureAlgorithm.HS512,secret)  //设置加密方式用512算法和密钥加密
                .compact();                                 //合成
    }


    //解析Jwt
    public Claims getClaimByToken(String jwt) {

        try {
            return Jwts.parser()                                //使用Jwts的parser工具解析器
                .setSigningKey(secret)                          //用密钥
                .parseClaimsJws(jwt)                            //解析
                .getBody();                                     //获取body部分
        } catch (Exception e) {                                 //如果抛出异常则返回null
            return null;
        }
    }


    //Jwt是否过期
    public boolean isTokenExpired(Claims claims) {
        return claims.getExpiration().before(new Date());        //判断Jwt过期时间是否在当前时间之前
    }

}
